package trival.selector;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import io.netty.channel.socket.nio.NioServerSocketChannel;

import javax.print.DocFlavor;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;


//再来自己写一遍体会一下
public class server {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel ssc= ServerSocketChannel.open();
        ssc.bind(new InetSocketAddress("localhost", 8080));
        while (true){
            //这个accept，是阻塞的
            //但是，当有连接建立的时候，它是可以接收多个的
            //即使存在已经建立连接的socket，也可以再次从全连接队列中获取
            //不同的连接，对应不同的已连接socket，为多个连接的并发处理提供基本保证
            //backlog参数
            SocketChannel accept = ssc.accept();
            if (accept==null)
                continue;
            //配置了非阻塞，在read不到值的时候，返回0
            //此时，如果要监听发过来的数据，就需要通过while循环，不断看返回值是否大于0，白白浪费cpu
            //若是配置阻塞，又是单线程处理，它阻塞了，其他事情都干不了，效率很低
            //若是多线程，每个线程对应一个socket去处理
            //而处理的过程中又经常发生阻塞，导致上下文切换，既浪费线程资源，又因为上下文切换导致效率降低

            //所以此时，selector 多路复用机制的好处，就体现出来了
            accept.configureBlocking(false);
            System.out.println(accept);
            new Thread(()->{
                ByteBuffer byteBuffer=ByteBuffer.allocate(16);
                try {
                    int read = accept.read(byteBuffer);
                    System.out.println(read);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}
